home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / LIB / BITMANIP.C < prev    next >
C/C++ Source or Header  |  1995-12-12  |  9KB  |  362 lines

  1. /* ============ */
  2. /* bitmanip.c    */
  3. /* ============ */
  4. /* -------------------------------------------------------------------- *
  5.  *                                    *
  6.  *            King Baker Enterprises, Inc.            *
  7.  *               Stillwater, Oklahoma                *
  8.  *                                    *
  9.  *             MODULE PROLOGUE                *
  10.  *                                    *
  11.  *  Name:    bitmanip.c                        *
  12.  *                                    *
  13.  *  Date:    24 October 1992                        *
  14.  *                                    *
  15.  *  Version:    1.0                            *
  16.  *                                    *
  17.  *  Purpose:    Provide bit manipulation services.            *
  18.  *                                    *
  19.  *  Design Document:    None.                        *
  20.  *                                    *
  21.  *  Author:  K. B. Williams                        *
  22.  *                                    *
  23.  *                 MODIFICATION HISTORY                *
  24.  *                                    *
  25.  *  Name of Modifier    Date/Time    Description            *
  26.  *  ----------------    ---------    -----------            *
  27.  *                                    *
  28.  * -------------------------------------------------------------------- */
  29. /* -------------------------------------------------------------------- */
  30. /*          BIPMANIP - BIT MANIPULATION FUNCTIONS         */
  31. /* -------------------------------------------------------------------- */
  32.  
  33. #include "bit_hlrs.h"
  34.  
  35. static
  36. UCHAR    bit_mask[] = {    1 << 7, 1 << 6, 1 << 5, 1 << 4,
  37.             1 << 3, 1 << 2, 1 << 1, 1
  38.              };
  39. /* INDENT ON */
  40.  
  41. /* ====================================================================    */
  42. /* ClrBitArray - sets num_bits in bit_ary at bit_posn to bit_val    */
  43. /* ====================================================================    */
  44. /* INDENT OFF */
  45. # if defined(__STDC__) || defined(__PROTO__)
  46. void
  47. ClrBitArray(UCHAR *bit_ary, UINT bit_posn, UINT num_bits, UCHAR bit_val)
  48. # else
  49. void
  50. ClrBitArray(bit_ary, bit_posn, num_bits, bit_val)
  51. UCHAR    *bit_ary;
  52. UINT     bit_posn;
  53. UINT     num_bits;
  54. UCHAR     bit_val;
  55. # endif
  56. /* INDENT ON */
  57. {
  58.      UINT    i;
  59.  
  60.     for (i = 0; i < num_bits; ++i)
  61.     {
  62.     SetBit(bit_ary, bit_posn + i, bit_val);
  63.     }
  64. }
  65. /* ==================================================================== */
  66. /* CmplBit - complements bit at bit_posn in bit_ary            */
  67. /* ==================================================================== */
  68. /* INDENT OFF */
  69. # if defined(__STDC__) || defined(__PROTO__)
  70. void
  71. CmplBit(UCHAR *bit_ary, UINT bit_posn)
  72. # else
  73. void
  74. CmplBit(bit_ary, bit_posn)
  75. UCHAR    *bit_ary;
  76. UINT     bit_posn;
  77. # endif
  78. /* INDENT ON */
  79. {
  80.     SetBit(bit_ary, bit_posn, (UCHAR)!TestBit(bit_ary, bit_posn));
  81. }
  82. /* ======================================================================== */
  83. /* CopyBits - copies bits in srce_bits @ srce_posn to dest_bits @ dest_posn */
  84. /* ======================================================================== */
  85. /* INDENT OFF */
  86. # if defined(__STDC__) || defined(__PROTO__)
  87. void
  88. CopyBits(UCHAR *srce_bits, UINT srce_posn, UINT num_bits,
  89.     UCHAR *dest_bits, UINT dest_posn)
  90. # else
  91. void
  92. CopyBits(srce_bits, srce_posn, num_bits, dest_bits, dest_posn)
  93. UCHAR    *srce_bits;
  94. UINT     srce_posn;
  95. UINT     num_bits;
  96. UCHAR    *dest_bits;
  97. UINT     dest_posn;
  98. # endif
  99. /* INDENT ON */
  100. {
  101.     UINT    i;
  102.     UCHAR   *srce_bit_addr, *dest_bit_addr;
  103.  
  104.     srce_bit_addr = srce_bits + (srce_posn >> 3) + (srce_posn & 0x07);
  105.     dest_bit_addr = dest_bits + (dest_posn >> 3) + (dest_posn & 0x07);
  106.  
  107.     if (srce_bit_addr >= dest_bit_addr)    /* copy bits forward */
  108.     {
  109.     for (i = 0; i < num_bits; ++i)
  110.     {
  111.         SetBit(dest_bits, dest_posn + i,
  112.         TestBit(srce_bits, srce_posn + i));
  113.     }
  114.     }
  115.     else                /* copy bits backward */
  116.     {
  117.     for (i = num_bits; i > 0; --i)
  118.     {
  119.         SetBit(dest_bits, dest_posn + i - 1,
  120.         TestBit(srce_bits, srce_posn + i - 1));
  121.     }
  122.     }
  123. }
  124. /* ====================================================================    */
  125. /* ReverseBits - copies num_bits backwards from srce_ary to dest_ary    */
  126. /* ====================================================================    */
  127. /* INDENT OFF */
  128. # if defined(__STDC__) || defined(__PROTO__)
  129. void
  130. ReverseBits(UCHAR *srce_ary, UINT srce_posn, UINT num_bits,
  131.          UCHAR *dest_ary, UINT dest_posn)
  132. # else
  133. void
  134. ReverseBits(srce_ary, srce_posn, num_bits, dest_ary, dest_posn)
  135. UCHAR    *srce_ary;
  136. UINT     srce_posn;            /* starting bit posn in srce_ary */
  137. UINT     num_bits;
  138. UCHAR    *dest_ary;
  139. UINT     dest_posn;            /* starting bit posn in dest_ary */
  140. # endif
  141. /* INDENT ON */
  142. {
  143.     UINT    i;
  144.  
  145.     if (srce_ary == dest_ary)
  146.     {
  147.     ReverseInSitu(srce_ary, srce_posn, num_bits);
  148.     }
  149.     else
  150.     {
  151.     for (i = 0; i < num_bits; ++i)
  152.     {
  153.         SetBit(dest_ary, dest_posn + i,
  154.         TestBit(srce_ary, (srce_posn + num_bits - 1) - i));
  155.     }
  156.     }
  157. }
  158. /* ====================================================================    */
  159. /* ReverseInSitu - reverses order of bits in srce_ary in situ        */
  160. /* ====================================================================    */
  161. /* INDENT OFF */
  162. # if defined(__STDC__) || defined(__PROTO__)
  163. void
  164. ReverseInSitu(UCHAR *srce_ary, UINT srce_posn, UINT num_bits)
  165. # else
  166. void
  167. ReverseInSitu(srce_ary, srce_posn, num_bits)
  168. UCHAR    *srce_ary;
  169. UINT     srce_posn;
  170. UINT     num_bits;
  171. # endif
  172. /* INDENT ON */
  173. {
  174.     UINT    i;
  175.  
  176.     for (i = 0; i < num_bits >> 1; ++i)
  177.     {
  178.     UCHAR    temp = TestBit(srce_ary, srce_posn + i);
  179.  
  180.     SetBit(srce_ary, srce_posn + i,
  181.         TestBit(srce_ary, srce_posn + (num_bits - 1) - i));
  182.  
  183.     SetBit(srce_ary, srce_posn + (num_bits - 1) - i, temp);
  184.     }
  185. }
  186. /* ==================================================================== */
  187. /* SetBit - sets bit at bit_posn in bit_ary to bit_val         */
  188. /* ==================================================================== */
  189. /* INDENT OFF */
  190. # if defined(__STDC__) || defined(__PROTO__)
  191. void
  192. SetBit(UCHAR *bit_ary, UINT bit_posn, UCHAR bit_val)
  193. # else
  194. void
  195. SetBit(bit_ary, bit_posn, bit_val)
  196. UCHAR    *bit_ary;
  197. UINT     bit_posn;
  198. UCHAR     bit_val;
  199. # endif
  200. /* INDENT ON */
  201.     {
  202.     if (bit_val)            /* set the bit */
  203.     {
  204.     bit_ary[bit_posn >> 3] |= bit_mask[bit_posn & 0x07];
  205.     }
  206.     else                /* clear the bit */
  207.     {
  208.     bit_ary[bit_posn >> 3] &= ~bit_mask[bit_posn & 0x07];
  209.     }
  210. }
  211. /* ==================================================================== */
  212. /* TestBit = returns 1 if bit at bit_posn in bit_ary is a 1, else 0    */
  213. /* ==================================================================== */
  214. /* INDENT OFF */
  215. # if defined(__STDC__) || defined(__PROTO__)
  216. UCHAR
  217. TestBit(UCHAR *bit_ary, UINT bit_posn)
  218. # else
  219. UCHAR
  220. TestBit(bit_ary, bit_posn)
  221. UCHAR    *bit_ary;
  222. UINT     bit_posn;
  223. # endif
  224. /* INDENT ON */
  225. {
  226.     return((UCHAR)(bit_ary[bit_posn >> 3] & bit_mask[bit_posn & 0x07]));
  227. }
  228. # ifdef DEBUG
  229. #include <stdio.h>
  230. /* ------------------- */
  231. /* FUNCTION PROTOTYPES */
  232. /* ------------------- */
  233. # undef F
  234. # if defined(__STDC__) || defined(__PROTO__)
  235. #     define  F( P )  P
  236. # else
  237. #     define  F( P )  ()
  238. # endif
  239.  
  240. /* INDENT OFF */
  241. extern    void    main F(( void ));
  242. extern    void    show_map F(( UCHAR * ));
  243. extern    void    test_manip F(( void ));
  244.  
  245. # undef F
  246. /* INDENT ON */
  247.  
  248. void
  249. main()
  250. {
  251.     test_manip();
  252. }
  253. void
  254. test_manip()
  255. {
  256.     int    i;
  257.  
  258.     UINT    bit_num, from, num_bits, to;
  259.     UCHAR    set;
  260.     static
  261.     UCHAR    bit_map[8] = { 0xAB, 0xCD, 0xEF, 'a', 'b', 'c', '1', '2'};
  262.     static
  263.     UCHAR    new_map[8];
  264.  
  265.     puts("Starting new_map");
  266.     show_map(new_map);
  267.  
  268.     ClrBitArray(new_map, 0, 64, 1);
  269.  
  270.     puts("All bits set to 1:");
  271.     show_map(new_map);
  272.  
  273.     ClrBitArray(new_map, 0, 64, 0);
  274.  
  275.     puts("All bits set to 0:");
  276.     show_map(new_map);
  277.  
  278.     for (i = 1; i < 64; i+=2)
  279.     {
  280.     CmplBit(new_map, i);
  281.     }
  282.  
  283.     puts("Odd-numbered bits complemented to 1");
  284.     show_map(new_map);
  285.  
  286.     for (i = 1; i < 64; i+=2)
  287.     {
  288.     CmplBit(new_map, i);
  289.     }
  290.  
  291.     puts("Odd-numbered bits recomplemented to 0");
  292.     show_map(new_map);
  293.  
  294.     ClrBitArray(new_map, 0, 1, 1);
  295.  
  296.     puts("First bit set to 1:");
  297.     show_map(new_map);
  298.  
  299.     ClrBitArray(new_map, 63, 1, 1);
  300.  
  301.     puts("Last bit set to 1:");
  302.     show_map(new_map);
  303.  
  304.     ClrBitArray(new_map, 7, 2, 1);
  305.  
  306.     puts("Two bits set to 1 at position 7:");
  307.     show_map(new_map);
  308.  
  309.     puts("Starting bit_map");
  310.     show_map(bit_map);
  311.  
  312.     puts("Reverse bits in situ:");
  313.     printf("from %x", bit_map[0]);
  314.     ReverseInSitu(bit_map, 0, 64);
  315.  
  316.     printf(" to %x\n", bit_map[7]);
  317.     show_map(bit_map);
  318.  
  319.     while (main)
  320.     {
  321.     ClrBitArray(new_map, 0, 64, 0);
  322.  
  323.     printf("\nBit number: ");
  324.     scanf("%d", &bit_num);
  325.     printf("1 to set, 0 to clear: ");
  326.     scanf("%d", &set);
  327.  
  328.     SetBit(bit_map, bit_num, set);
  329.  
  330.     puts("New map");
  331.     show_map(bit_map);
  332.  
  333.     printf("Extract from bit #: ");
  334.     scanf("%d", &from);
  335.     printf("Number of bits: ");
  336.     scanf("%d", &num_bits);
  337.  
  338.     printf("\nCopy into position: ");
  339.     scanf("%d", &to);
  340.  
  341.     CopyBits(bit_map, from, num_bits, new_map, to);
  342.  
  343.     puts("Extracted map (NEW BIT ARRAY)");
  344.     show_map(new_map);
  345.     }
  346. }
  347. void
  348. show_map(UCHAR *bit_map)
  349. {
  350.     UINT    i;
  351.  
  352.     puts("0    v    1    v    2    v    3    v    4    v    5    v    6");
  353.     puts(".....|....0....|....0....|....0....|....0....|....0....|....0...");
  354.     for (i = 0; i < 64; ++i)
  355.     {
  356.     putchar(TestBit(bit_map, i) ? 'X' : '.');
  357.     }
  358.     printf("\t\tpress <CR>");
  359.     getchar();
  360. }
  361. # endif
  362.